﻿// -----------------------------------------------------------------------
// <copyright file="GerenciadorPrestadorPrestadorPrestadorServico.cs" company="">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------

namespace Service
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Persistence;
    using Model;
    using System.Data.Objects;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class GerenciadorPrestadorServico
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorPrestadorServico()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorPrestadorServico(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="servico">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(PrestadorServicoModel prestadorservico)
        {
            tb_prestador_servico prestadorservicoE = new tb_prestador_servico();
            Atribuir(prestadorservico, prestadorservicoE);
            unitOfWork.RepositorioPrestadorServico.Inserir(prestadorservicoE);
            unitOfWork.Commit(shared);
            return prestadorservicoE.id_servico;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="servico"></param>
        public void Editar(PrestadorServicoModel prestadorservico)
        {
            tb_prestador_servico prestadorservicoE = new tb_prestador_servico();
            Atribuir(prestadorservico, prestadorservicoE);
            unitOfWork.RepositorioPrestadorServico.Editar(prestadorservicoE);
            unitOfWork.Commit(shared);
        }

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="servico"></param>
        public void Remover(int IDPrestadorServico)
        {
            unitOfWork.RepositorioPrestadorServico.Remover(prestadorservicoE => prestadorservicoE.id_servico.Equals(IDPrestadorServico));
            unitOfWork.Commit(shared);
        }

        


        /// <summary>
        /// Consulta padrão para retornar dados do Serviço como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<PrestadorServicoModel> GetQuery()
        {
            IQueryable<tb_prestador_servico> tb_prestador_servico = unitOfWork.RepositorioPrestadorServico.GetQueryable();
            var query = from prestadorservicoE in tb_prestador_servico
                        select new PrestadorServicoModel
                        {
                            idpPrestador = prestadorservicoE.id_prestador,
                            IDscodigo= prestadorservicoE.id_servico,
                            psvalorServico = prestadorservicoE.cliente_servico_valor,
                            NomePrestador = prestadorservicoE.tb_prestador.tb_cliente.cliente_nome,
                            especialidade = prestadorservicoE.tb_servico.tb_especialidade.especialidade_nome,
                            servicos = prestadorservicoE.tb_servico.servico_nome
                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<PrestadorServicoModel> ObterTodos()
        {
            return GetQuery();
        }

        public IEnumerable<PrestadorServicoModel> ObterTodosParametro(string txt)
        {
            return GetQuery().Where(prestador => prestador.NomePrestador.Equals(txt)|| prestador.especialidade.Equals(txt));
        }
        public IEnumerable<PrestadorServicoModel> ObterPrestador(int idPrestador )
        {
            return GetQuery().Where(prestador => prestador.idpPrestador.Equals(idPrestador));
        }

        /// <summary>
        /// Obtém um Serviço
        /// </summary>
        /// <param name="id_servico">Identificador do serviço na base de dados</param>
        /// <returns>PrestadorPrestadorServicoModel</returns>
        public PrestadorServicoModel Obter(int IDPrestadorServico)
        {
            IEnumerable<PrestadorServicoModel> prestadorservico = GetQuery().Where(PrestadorServicoModel => PrestadorServicoModel.idpPrestador.Equals(IDPrestadorServico));
            return prestadorservico.ElementAtOrDefault(0);
        }

        public PrestadorServicoModel Obter(decimal valorServico)
        {
            IEnumerable<PrestadorServicoModel> prestadorservico = GetQuery().Where(PrestadorServicoModel => PrestadorServicoModel.psvalorServico.Equals(valorServico));
            return prestadorservico.ElementAtOrDefault(0);
        }

        /// <summary>
        /// Atribui dados do PrestadorPrestadorServicoModel para o PrestadorPrestadorServico Entity
        /// </summary>
        /// <param name="servico">Objeto do modelo</param>
        /// <param name="serE">Entity mapeada da base de dados</param>
        private void Atribuir(PrestadorServicoModel prestadorservico, tb_prestador_servico prestadorservicoE)
        {
            prestadorservicoE.id_servico = prestadorservico.IDscodigo;
            prestadorservicoE.id_prestador = prestadorservico.idpPrestador;
            prestadorservicoE.cliente_servico_valor = prestadorservico.psvalorServico;
            prestadorservicoE.prestador_servico_ativo = 1;


        }

      
        public IQueryable ObterPrestadores()
        {

            using (itaservicosbdEntities context = new itaservicosbdEntities())
            {

                ObjectSet<tb_prestador_servico> TB_prestadorServicos = context.tb_prestador_servico;
                ObjectSet<tb_especialidade> TB_especialidades = context.tb_especialidade;
                //  ObjectSet<tb_item_servico> TB_itemservicos = context.tb_item_servico;
                ObjectSet<tb_cliente> TB_clientes = context.tb_cliente;
                ObjectSet<tb_servico> TB_servico = context.tb_servico;
                ObjectSet<tb_prestador> TB_prestador = context.tb_prestador;

                var query =
                from prestador in TB_prestador

                join cliente in TB_clientes
                on prestador.id_cliente equals cliente.id_cliente

                join prestadorservico in TB_prestadorServicos
                on prestador.id_prestador equals prestadorservico.id_prestador

                join servico in TB_servico
                on prestadorservico.id_servico equals servico.id_servico

                join especialidade in TB_especialidades
                on servico.id_especialidade equals especialidade.id_especialidade

                where cliente.cliente_flag == 1 && servico.servico_ativo == 1 &&
                especialidade.especialidade_ativo == 1 && prestadorservico.prestador_servico_ativo == 1


                orderby especialidade.especialidade_nome

                select new
                {
                    Profissional = especialidade.especialidade_nome,
                    PrestadorServico = cliente.cliente_nome,
                    Servico = servico.servico_nome,
                    Descricao = servico.servico_descricao,
                    Valor = prestadorservico.cliente_servico_valor,
                };

                return query;
            }

        }


        public IQueryable ObterPrestadoresPorNomeOuEspecialidade(string nome)
        {

            using (itaservicosbdEntities context = new itaservicosbdEntities())
            {

                ObjectSet<tb_prestador_servico> TB_prestadorServicos = context.tb_prestador_servico;
                ObjectSet<tb_especialidade> TB_especialidades = context.tb_especialidade;
                //  ObjectSet<tb_item_servico> TB_itemservicos = context.tb_item_servico;
                ObjectSet<tb_cliente> TB_clientes = context.tb_cliente;
                ObjectSet<tb_servico> TB_servico = context.tb_servico;
                ObjectSet<tb_prestador> TB_prestador = context.tb_prestador;

                var query =
                from prestador in TB_prestador

                join cliente in TB_clientes
                on prestador.id_cliente equals cliente.id_cliente

                join prestadorservico in TB_prestadorServicos
                on prestador.id_prestador equals prestadorservico.id_prestador

                join servico in TB_servico
                on prestadorservico.id_servico equals servico.id_servico

                join especialidade in TB_especialidades
                on servico.id_especialidade equals especialidade.id_especialidade

                where (cliente.cliente_flag == 1 && servico.servico_ativo == 1 &&
                especialidade.especialidade_ativo == 1 && prestadorservico.prestador_servico_ativo == 1) &&
                (cliente.cliente_nome == nome || especialidade.especialidade_nome == nome)


                orderby especialidade.especialidade_nome

                select new
                {
                    Profissional = especialidade.especialidade_nome,
                    PrestadorServico = cliente.cliente_nome,
                  
                };

                return query;
            }

        }
    }
}
